# 匿名函数又叫lambda表达式,是函数的另外一种定义方式,定义时和def存在差异,调用时,完全一致.
# 格式: lambda 参数列表:返回值

# 需求: 创建一个函数,输入两个数字,通过计算返回两个数字的和.
print('------------def 定义普通函数----------------------')
# def 定义普通函数
def sum1(num1, num2):
    return num1 + num2


print(sum1(3, 4))  # 7

print('--------------lambda 表达式定义匿名函数--------------------')
# lambda 表达式定义匿名函数
# 定义:
lambda num1, num2: num1 + num2

# 调用:
# 方式一: 直接调用
# 此方法不需要函数名,但是这种方法定义的匿名函数只能调用一次,下次使用需要重新定义.
res = (lambda num1, num2: num1 + num2)(3, 4)  # 7
print(res)

print('-----------------方式二: 间接调用 (使用变量接收匿名函数后再使用()进行调用)-----------------')
# 方式二: 间接调用 (使用变量接收匿名函数后再使用()进行调用)
sum2 = lambda num1, num2: num1 + num2
print(sum2(3, 4))  # 7
# 使用方式二定义的匿名函数,可以多次使用
print(sum2(4, 5))  # 9

# 匿名函数的最大作用就是可以将函数更加方便的以参数的形式传递到函数体内部

print('--------------sort 函数 (列表排序函数)--------------------')
# sort 函数 (列表排序函数)
list1 = [1, 2, 6, 7, 5, 4, 3]
list1.sort()
print(list1)  # [1, 2, 3, 4, 5, 6, 7]

# sort的完整格式 列表.sort(self, key, reverse)
# self : 不需要传值,系统自动传值
# key : 排序规则,需要传递一个函数,一般我们习惯使用匿名函数
# reverse : 升序降序, 默认为False 是升序, 如果修改为True 是降序

print('----------------------------------')
# sort函数中的key参数需要传递一个函数定义
list2 = [(3, 4), (2, 1), (5, 3), (6, 2)]
# 需求:自定义规则进行排序,让list2中的元素,按照元组中的第二个元素的大小进行排序
# 举例: (3,4) > (5,3)  因为 4 大于 3
# 此时就需要使用到参数key : 列表.sort(key = lambda 元素 : 排序规则)
list2.sort(key=lambda x: x[1])

# sort(key=lambda x: x[1])解释: 遍历列表,每次将一个元素进行传入,用x接收, 我们返回的排序规则是x[1],也就是按照元组元素的下标为1的元素排列大小
print(list2)  # [(2, 1), (6, 2), (5, 3), (3, 4)]

print('-----------------1-----------------')
# 练习:
# 1. 使用lambda表达式，随机传入任意多个数据，并计算累加和， 使用两种方式调用（*args）
res = (lambda *args: sum(args))(1, 2, 3, 5, 6, 8, 9)
print(res)  # 34

func1 = lambda *args: sum(args)
print(func1(1, 2, 3, 5, 6, 7, 8))  # 32

print('------------------2----------------')
# 2. 使用lambda表达式，计算a 和 b 中的较大值，并返回（选做）
max1 = lambda a, b: max(a, b)
print(max1(1, 2))

# lambda函数过于复杂后,可读性会变差
max2 = lambda a, b: a if a > b else b
print(max2(4, 9))

print('--------------3--------------------')
# 3. 使用lambda进行排序, 排序规则是按照元素除以4的余数大小进行排序
list3 = [4, 8, 3, 6, 5, 7, 9]
list3.sort(key=lambda x: x % 4, reverse=True)
print(list3)


# lambda表达式缺点:
# 1.如果函数结构或功能过于复杂,则无法使用lambda完成,使用lambda 表达式创建的函数只能书写一个返回值表达式,例如判断循环等都不能出现
# 2.可读性较差,一般不建议书写过于复杂的lambda

